// 1.直接定的属性是实力属性，需要通过实例去访问
// 2.使用 static 开头的是静态属性（类属性），通过类直接访问
// 3.readonly 开头的属性表示一个只读的属性，无法修改
class Person {
    // 定义属性
    name:string;
    age:number;
    static readonly sex: string = '男性'
    constructor(name:string, age:number){
        this.name = name,
        this.age = age
    }
    // 定义方法
    say(){
        console.log(`你好，我是${this.name},今年${ this.age }岁了`);
    }
}
const p = new Person('黄锐伟最帅',18)
p.say()

console.log(Person.sex);

// 类中属性的三种修饰符
// 1.public 公共的：默认值，可以在类、子类和对象中修改
// 2.protected 保护，可以在类、子类中修改
// 3.private 私有的,可以在类中修改
class Zoon {
    public name:string;
    constructor(name:string){
        this.name = name;
        this.name = '动物都'
    }
    cry(){
        console.log(`${this.name}叫了`);
        
    }
}
class Cat extends Zoon {
    constructor(name:string){
        super(name)
        this.name = name
    }
}
const cat = new Zoon('猫')
cat.name = '猫儿'
cat.cry()
const dog = new Zoon('🐶')
dog.cry()
const catSon = new Cat('猫儿子')
catSon.cry()

// 抽象类 abstract
// 抽象类是专门用来被其他类所继承的类，它只能被其他类所继承不能用来创建实例
// 使用abstract开头的方法叫做抽象方法，抽象方法没有方法体只能定义在抽象类中，继承抽象类时抽象方法必须要实现
abstract class Animal {
    abstract run():void;
    bark(){
        console.log('动物在叫');
    }
}
class Dog extends Animal {
    run(){
        console.log('狗叫什么');
    }
}

